﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sispe.Entities;
using Sispe.Repository;
using Microsoft.Practices.Unity;

namespace Sispe.BussinesLogic
{
    public class ProyectoBL: IProyectoBL
    {
        [Dependency]
        public IProyectoRepository proyectoRepository { get; set; }

        [Dependency]
        public IAdendaRepository adendaRepository { get; set; }

        public List<PROYECTO> GetAllFromProyectos()
        {
            return proyectoRepository.GetAllFromProyectos();
        }

        public List<PROYECTO> GetAllFromProyectosByDescripcion(string descripcion)
        {
            return proyectoRepository.GetAllFromProyectosByDescripcion(descripcion);
        }

        public PROYECTO GetFromProyectoById(int id)
        {
            return proyectoRepository.GetFromProyectoById(id);
        }

        public void AddProyecto(PROYECTO proyecto)
        {
            var msg = "";
            var ok = proyecto.Validate(out msg);
            if (ok)
            {
                var duplicidad = proyectoRepository.ExisteDuplicidad(proyecto.NombreProyecto, proyecto.CodigoProyecto, proyecto.IdProyecto);

                if (!duplicidad)
                {
                    if (proyecto.Presupuesto != 0)
                    {
                        proyectoRepository.AddProyecto(proyecto);
                    }
                    else
                    {
                        var error = string.Format("El Presupuesto no puede ser '0'");
                        throw new Exception(error);
                    }
                    
                }
                else
                {
                    var error = string.Format("Ya existe un proyecto con el mismo nombre: " + proyecto.NombreProyecto);
                    throw new Exception(error);
                }
            }
            else
            {
                throw new Exception(msg);
            }
        }

        public void UpdateProyecto(PROYECTO proyecto)
        {
            var msg = "";
            var ok = proyecto.Validate(out msg);
            if (ok)
            {
                var duplicidad = proyectoRepository.ExisteDuplicidad(proyecto.NombreProyecto, proyecto.CodigoProyecto, proyecto.IdProyecto);

                if (!duplicidad)
                {
                    if (proyecto.Presupuesto != 0)
                    {
                        proyectoRepository.UpdateProyecto(proyecto);
                    }
                    else
                    {
                        var error = string.Format("El Presupuesto no puede ser '0'");
                        throw new Exception(error);
                    }
                }
                else
                {
                    var error = string.Format("Ya existe un proyecto con el mismo nombre: " + " " + "\n" + proyecto.NombreProyecto);
                    throw new Exception(error);
                }
            }
            else
            {
                throw new Exception(msg);
            }
        }

        public void DeleteProyecto(int id)
        {
            proyectoRepository.DeleteProyecto(id);
        }


        public PROYECTO GetFromProyectoByCodigo(string codigo)
        {
            return proyectoRepository.GetFromProyectoByCodigo(codigo);
        }


        public List<PROYECTO> GetAllProyectosVigentes()
        {
            return proyectoRepository.GetAllProyectosVigentes();
        }

        public List<PROYECTO> GetAllProyectosByCliente(string descripcion)
        {
            return proyectoRepository.GetAllProyectosByCliente(descripcion);
        }

        public List<PROYECTO> GetAllProyectosByUbicacion(string ubicacion)
        {
            return proyectoRepository.GetAllProyectosByUbicacion(ubicacion);
        }

        public List<PROYECTO> GetAllFromProyectoVigentessByDescripcion(string descripcion)
        {
            return proyectoRepository.GetAllFromProyectoVigentessByDescripcion(descripcion);
        }

        public List<PROYECTO> GetAllProyectosVigentesByCliente(string descripcion)
        {
            return proyectoRepository.GetAllFromProyectosVigentesByCliente(descripcion);
        }

        public List<PROYECTO> GetAllProyectosVigentesByUbicacion(string ubicacion)
        {
            return proyectoRepository.GetAllFromProyectosVigentesByUbicacion(ubicacion);
        }


        public List<PROYECTO> GetAllFromProyectosByFecha(DateTime fecIni, DateTime fecFin)
        {
            return proyectoRepository.GetAllFromProyectosByFecha(fecIni, fecFin);
        }

        public List<PROYECTO> GetAllFromProyectosByDescripcionByFecha(string descripcion, DateTime fecIni, DateTime fecFin)
        {
            return proyectoRepository.GetAllFromProyectosByDescripcionByFecha(descripcion, fecIni,fecFin);
        }

        public List<PROYECTO> GetAllProyectosVigentesByFecha(DateTime fecIni, DateTime fecFin)
        {
            return proyectoRepository.GetAllFromProyectosVigentesByFecha(fecIni, fecFin);
        }

        public List<PROYECTO> GetAllProyectosByClienteByFecha(string descripcion, DateTime fecIni, DateTime fecFin)
        {
            return proyectoRepository.GetAllFromProyectosByClienteByFecha(descripcion, fecIni, fecFin);
        }

        public List<PROYECTO> GetAllProyectosByUbicacionByFecha(string ubicacion, DateTime fecIni, DateTime fecFin)
        {
            return proyectoRepository.GetAllFromProyectosByUbicacionByFecha(ubicacion, fecIni, fecFin);
        }

        public List<PROYECTO> GetAllFromProyectoVigentessByDescripcionByFecha(string descripcion, DateTime fecIni, DateTime fecFin)
        {
            return proyectoRepository.GetAllFromProyectoVigentessByDescripcionByFecha(descripcion,fecIni,fecFin);
        }

        public List<PROYECTO> GetAllProyectosVigentesByClienteByFecha(string descripcion, DateTime fecIni, DateTime fecFin)
        {
            return proyectoRepository.GetAllFromProyectosByClienteByFecha(descripcion, fecIni, fecFin);
        }

        public List<PROYECTO> GetAllProyectosVigentesByUbicacionByFecha(string ubicacion, DateTime fecIni, DateTime fecFin)
        {
            return proyectoRepository.GetAllFromProyectosVigentesByUbicacionByFecha(ubicacion, fecIni, fecFin);
        }


        public List<PROYECTO> GetAllFromProyectoByNombreByCliente(string proyecto, string cliente)
        {
            return proyectoRepository.GetAllFromProyectoByNombreByCliente(proyecto, cliente);
        }

        public List<PROYECTO> GetAllFromProyectoByNombreByClienteByFecha(string proyecto, string cliente, DateTime fecIni, DateTime fecFin)
        {
            return proyectoRepository.GetAllFromProyectoByNombreByClienteByFecha(proyecto, cliente, fecIni, fecFin);
        }

        public List<PROYECTO> GetAllFromProyectoByNombreByUbicacion(string proyecto, string ubicacion)
        {
            return proyectoRepository.GetAllFromProyectoByNombreByUbicacion(proyecto, ubicacion);
        }

        public List<PROYECTO> GetAllFromProyectoByNombreByUbicacionByFecha(string proyecto, string ubicacion, DateTime fecIni, DateTime fecFin)
        {
            return proyectoRepository.GetAllFromProyectoByNombreByUbicacionByFecha(proyecto, ubicacion, fecIni, fecFin);
        }

        public List<PROYECTO> GetAllFromProyectoByNombreByClienteBYUbicacion(string proyecto, string cliente, string ubicacion)
        {
            return proyectoRepository.GetAllFromProyectoByNombreByClienteBYUbicacion(proyecto, cliente, ubicacion);
        }

        public List<PROYECTO> GetAllFromProyectoByNombreByClienteBYUbicacionByFecha(string proyecto, string cliente, string ubicacion, DateTime fecIni, DateTime fecFin)
        {
            return proyectoRepository.GetAllFromProyectoByNombreByClienteBYUbicacionByFecha(proyecto, cliente, ubicacion, fecIni, fecFin);
        }

        public List<PROYECTO> GetAllFromProyectosByCLienteByUbicacion(string cliente, string ubicacion)
        {
            return proyectoRepository.GetAllFromProyectosByCLienteByUbicacion(cliente, ubicacion);
        }

        public List<PROYECTO> GetAllFromProyectosByCLienteByUbicacionByFecha(string cliente, string ubicacion, DateTime fecIni, DateTime fecFin)
        {
            return proyectoRepository.GetAllFromProyectosByCLienteByUbicacionByFecha(cliente, ubicacion, fecIni, fecFin);
        }

        public List<PROYECTO> GetAllFromProyectosVigentesByNombreByCliente(string proyecto, string cliente)
        {
            return proyectoRepository.GetAllFromProyectosVigentesByNombreByCliente(proyecto, cliente);
        }

        public List<PROYECTO> GetAllFromProyectosVigentesByNombreByClienteByFecha(string proyecto, string cliente, DateTime fecIni, DateTime fecFin)
        {
            return proyectoRepository.GetAllFromProyectosVigentesByNombreByClienteByFecha(proyecto, cliente,fecIni,fecFin);
        }

        public List<PROYECTO> GetAllFromProyectosVigentesByNombreByUbicacion(string proyecto, string ubicacion)
        {
            return proyectoRepository.GetAllFromProyectosVigentesByNombreByUbicacion(proyecto, ubicacion);
        }

        public List<PROYECTO> GetAllFromProyectosVigentesByNombreByUbicacionByFecha(string proyecto, string ubicacion, DateTime fecIni, DateTime fecFin)
        {
            return proyectoRepository.GetAllFromProyectosVigentesByNombreByUbicacionByFecha(proyecto, ubicacion,fecIni,fecFin);
        }

        public List<PROYECTO> GetAllFromProyectsVigentesoByNombreByClienteBYUbicacion(string proyecto, string cliente, string ubicacion)
        {
            return proyectoRepository.GetAllFromProyectsVigentesoByNombreByClienteBYUbicacion(proyecto,cliente,ubicacion);
        }

        public List<PROYECTO> GetAllFromProyectosVigentesByNombreByClienteBYUbicacionByFecha(string proyecto, string cliente, string ubicacion, DateTime fecIni, DateTime fecFin)
        {
            return proyectoRepository.GetAllFromProyectosVigentesByNombreByClienteBYUbicacionByFecha(proyecto,cliente,ubicacion,fecIni,fecFin);
        }

        public List<PROYECTO> GetAllFromProyectosVigentesByCLienteByUbicacion(string cliente, string ubicacion)
        {
            return proyectoRepository.GetAllFromProyectosVigentesByCLienteByUbicacion(cliente, ubicacion);
        }

        public List<PROYECTO> GetAllFromProyectosVigentesByCLienteByUbicacionByFecha(string cliente, string ubicacion, DateTime fecIni, DateTime fecFin)
        {
            return proyectoRepository.GetAllFromProyectosVigentesByCLienteByUbicacionByFecha(cliente, ubicacion, fecIni, fecFin);
        }


        public bool ExisteDuplicidad(string nombreProyecto, string codigo, int id)
        {
            return proyectoRepository.ExisteDuplicidad(nombreProyecto, codigo, id);
        }
    }
}
